a) Skriv to udgaver af programmet som laver matrix multiplikation på en 400x400 matrice. Kompiler dem med
udgave1
#include <stdio.h>
#include <string.h>
#define NUM 600
int main(void)
{
double A[NUM][NUM];
double B[NUM][NUM];
double C[NUM][NUM];
int i,j,k;
int N = NUM;
for (i=0; i<N; i++) {
for (j=0; j<N; j++) {
for (k=0; k<N; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
return C[N-1][N-1];
}
udgave2
#include <stdio.h>
#include <string.h>
#define NUM 400
double A[NUM][NUM];
double B[NUM][NUM];
double C[NUM][NUM];
int main(void)
{
int i,j,k;
int N = NUM;
double tmp[N][N];
for (i = 0; i < N; ++i)
for (j = 0; j < N; ++j)
tmp[i][j] = B[j][i];
for (i = 0; i < N; ++i)
for (j = 0; j < N; ++j)
for (k = 0; k < N; ++k)
C[i][j] += A[i][k] * B[j][k];
return C[N-1][N-1];
}
b) Mål tidsforbruget for udførslen af matrix multiplikationen
stud@GoldenImage:~/MPS/Opgave10$ time ./matrix
real 0m1.875s
user 0m0.620s
sys 0m1.232s
c) Kør programmerne med Cachegrind og noter den procentuelle cache-miss:
==4171== D1 miss rate: 1.4% ( 1.6% + 0.0% )
==4171== LLd miss rate: 0.8% ( 0.8% + 0.0% )
d) Fortsæt dataopsamlingen med de forskellige optimiserings parametre (Hvad gør de forskellige optimeringer??) Sammenlign resultaterne, er der forskel i performance? Hvad virker bedst og hvorfor?
1. optimering
==4295== D1 miss rate: 11.2% ( 11.1% + 21.0% )
==4295== LLd miss rate: 6.2% ( 6.2% + 0.0% )
2.optimering
==4224== D1 miss rate: 11.1% ( 11.0% + 40.2% )
==4224== LLd miss rate: 6.2% ( 6.2% + 0.0% )
3.optimering
==4212== D1 miss rate: 11.1% ( 11.0% + 40.2% )
==4212== LLd miss rate: 6.2% ( 6.2% + 0.0%
e) Kompiler programmet til target (arm-none-linux-gnueabi-gcc) og eksekvér det herpå med time.
der opstår en segmentation fault. da stackens størelse på 8192kB bliver overskredet nedenfor kan se ses udskriften.
Segmentation fault
real 0m20.953s
user 0m20.854s
sys 0m0.076s
udgave1
#include <stdio.h> #include <string.h> #define NUM 600 int main(void) { double A[NUM][NUM]; double B[NUM][NUM]; double C[NUM][NUM]; int i,j,k; int N = NUM; for (i=0; i<N; i++) { for (j=0; j<N; j++) { for (k=0; k<N; k++) { C[i][j] += A[i][k] * B[k][j]; } } } return C[N-1][N-1]; }udgave2
#include <stdio.h> #include <string.h> #define NUM 400 double A[NUM][NUM]; double B[NUM][NUM]; double C[NUM][NUM]; int main(void) { int i,j,k; int N = NUM; double tmp[N][N]; for (i = 0; i < N; ++i) for (j = 0; j < N; ++j) tmp[i][j] = B[j][i]; for (i = 0; i < N; ++i) for (j = 0; j < N; ++j) for (k = 0; k < N; ++k) C[i][j] += A[i][k] * B[j][k]; return C[N-1][N-1]; }b) Mål tidsforbruget for udførslen af matrix multiplikationen
stud@GoldenImage:~/MPS/Opgave10$ time ./matrix
real 0m1.875s
user 0m0.620s
sys 0m1.232s
c) Kør programmerne med Cachegrind og noter den procentuelle cache-miss:
d) Fortsæt dataopsamlingen med de forskellige optimiserings parametre (Hvad gør de forskellige optimeringer??) Sammenlign resultaterne, er der forskel i performance? Hvad virker bedst og hvorfor?
1. optimering
2.optimering
3.optimering
e) Kompiler programmet til target (arm-none-linux-gnueabi-gcc) og eksekvér det herpå med time.
der opstår en segmentation fault. da stackens størelse på 8192kB bliver overskredet nedenfor kan se ses udskriften.